package io.serializable;

import java.io.*;
import java.util.ArrayList;

/**
 *  1)对象的类名,属性(包括基本类型,数组,对其他对象的引用)都会被序列化; 方法, static属性(静态属性), transient属性(瞬态属性)
 *     都不会被序列化.
 *     2)实现Serializable接口的类如果要想让某个属性不被序列化, 可用transient修饰该属性, 而不是用static修饰该属性.(虽然static)
 *     也能达到这样的效果, 但static不能这样用.
 *     3)保证序列化对象的属性的类型也是可序列化的, 否则, 该类是不可序列化的.
 *     4)反序列化对象时必须有对象的class文件.
 *     5)当通过文件或者网络来读取序列化后对象时,必须按实际写入的顺序读取.
       6)序列化反序列化ID必须相同，否则java.io.InvalidClassException
 */
public class Test {
    public static void main(String[] args) throws IOException, ClassNotFoundException {
//        FileOutputStream fos = new FileOutputStream("./other/src/io/serializable/person.data");
//        ObjectOutputStream objectOutputStream = new ObjectOutputStream(fos);
//        ArrayList<String> list = new ArrayList<>();
//        list.add("123");
//        list.add("456");
//        Person person = new Person(11, "小明", "123456", list);
//
//        objectOutputStream.writeObject(person);
//
//        objectOutputStream.close();
//        fos.close();

        FileInputStream fis = new FileInputStream("./other/src/io/serializable/person.data");
        ObjectInputStream objectInputStream = new ObjectInputStream(fis);
        Person object = (Person) objectInputStream.readObject();

        System.out.println(object);

    }
}
